package com.itheima.service;

import com.itheima.dto.ChangePasswordDTO;
import com.itheima.dto.UserLoginDTO;
import com.itheima.entity.User;
import com.itheima.repository.UserRepository;
import com.itheima.util.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private JwtUtil jwtUtil;

    // 用户注册逻辑
    public String registerUser(UserLoginDTO userLoginDTO) {
        // 检查用户名是否已存在
        if (userRepository.existsByUsername(userLoginDTO.getUsername())) {
            return "Username already exists";
        }

        // 创建新用户对象
        User user = new User();
        user.setUsername(userLoginDTO.getUsername());
        user.setPassword(userLoginDTO.getPassword());
        user.setIsSuper(false); // 默认不是超级管理员
        user.setCreatedAt(new Date()); // 默认创建时间为当前时间

        // 保存新用户
        userRepository.save(user);
        return "User registered successfully";
    }

    // 用户登录
    public Map<String, String> loginUser(UserLoginDTO loginDTO) {
        User user = userRepository.findByUsernameAndPassword(loginDTO.getUsername(), loginDTO.getPassword());
        if (user != null) {
            String token = jwtUtil.generateToken(user);  // 生成JWT Token
            String userType = user.getIsSuper() ? "ADMIN" : "USER";  // 判断用户类型
            Map<String, String> result = new HashMap<>();
            result.put("token", token);
            result.put("userType", userType);
            return result;
        }
        Map<String, String> result = new HashMap<>();
        result.put("error", "Invalid credentials");
        return result;
    }

    // 修改密码
    public String changePassword(String token, ChangePasswordDTO changePasswordDTO) {
        String username = jwtUtil.extractUsername(token);  // 提取用户名
        System.out.println(username);
        if (username == null) {
            return "Invalid token";
        }

        User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new RuntimeException("User not found"));

        // 校验旧密码是否正确
        if (!user.getPassword().equals(changePasswordDTO.getOldPassword())) {
            return "Old password is incorrect";
        }

        // 更新密码（在实际应用中应该使用加密密码）
        user.setPassword(changePasswordDTO.getNewPassword());
        userRepository.save(user);

        return "Password updated successfully";
    }

    // 用户登出
    public void logout(String token) {
        // JWT通常是无状态的，在登出时并不直接销毁
        // 前端需要清除存储的Token，后端一般没有做处理
        // 如果你需要，后端可以维护一个Token黑名单来防止已注销Token再次使用
    }

    public Optional<User> findByUsername(String username) {
         return userRepository.findByUsername(username);
    }
}